/**
 * 处理异步操作和修改、以及对mutation操作的封装
 * 在一个动作中多次修改mutations，在actions中封装
 */

import * as types from './mutation-types'
import {playMode} from 'common/js/config'
import {shuffle} from 'common/js/util'
import {saveSearch, deleteSearch, clearSearch, savePlay, saveFavorite, deleteFavorite} from 'common/js/cache'


function findIndex(list, song) {
  return list.findIndex((item) => {
    return item.id = song.id
  })
}

//顺序播放
export const selectPlay = function ({commit, state}, {list, index}) {//选择播放
  commit(types.SET_SEQUENCE_LIST, list)
  if (state.mode === playMode.random) {
    let randomList = shuffle(list)
    commit(types.SET_PLAYLIST, randomList)
    index = findIndex(randomList, list[index])
  } else {
    commit(types.SET_PLAYLIST, list)
  }
  commit(types.SET_CURRENT_INDEX, index)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)
}

//随机播放
export const randomPlay = function ({commit}, {list}) {
  commit(types.SET_PLAY_MODE, playMode.random)
  commit(types.SET_SEQUENCE_LIST, list)
  let randomlist = shuffle(list)
  commit(types.SET_PLAYLIST, randomlist)
  commit(types.SET_CURRENT_INDEX, 0)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)
}


export const insertSong = function ({commit, state}, song) {
  let playlist = state.playlist.slice() //副本
  let sequenceList = state.sequenceList.slice() //副本
  let currentIndex = state.currentIndex
  //记录当前歌曲
  let currentSong = playlist[currentIndex]
  //查找当前列表中是否有待插入的歌曲并返回其索引
  let fpIndex = findIndex(playlist, song)
  //因为是插入歌曲，所以索引+1
  currentIndex++
  //插入这首歌到当前索引位置
  playlist.splice(currentIndex, 0, song)
  //如果已经包含了这首歌
  if (fpIndex > -1) {
    //如果当前插入的序号大于列表中的序号
    if (currentIndex > fpIndex) {
      playlist.splice(fpIndex, 1)
      currentIndex--
    } else {
      playlist.splice(fpIndex + 1, 1)
    }
  }

  let currentSIndex = findIndex(sequenceList, currentSong) + 1

  let fsIndex = findIndex(sequenceList, song)

  sequenceList.splice(currentSIndex, 0, song)

  if (fsIndex > -1) {
    if (currentSIndex > fsIndex) {
      sequenceList.splice(fsIndex, 1)
    } else {
      sequenceList.splice(fsIndex + 1, 1)
    }
  }

  commit(types.SET_PLAYLIST, playlist)
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  commit(types.SET_CURRENT_INDEX, currentIndex)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)
}


export const saveSearchHistory = function ({commit}, query) {  //保存本地存储  历史记录
  commit(types.SET_SEARCH_HISTORY, saveSearch(query))
}


export const deleteSearchHistory = function ({commit}, query) { //删除本地存储 历史记录
  commit(types.SET_SEARCH_HISTORY, deleteSearch(query))
}


export const clearSearchHistory = function ({commit}) { //删除全部本地存储 历史记录
  commit(types.SET_SEARCH_HISTORY, clearSearch())  //返回是一个空数组 clearSearch()
}


export const deleteSong = function ({commit, state}, song) { //删除全部本地存储 历史记录歌曲
  let playlist = state.playlist.slice() //歌曲列表副本
  let sequenceList = state.sequenceList.slice()  //歌曲列表索引副本
  let currentIndex = state.currentIndex
  let pIndex = findIndex(playlist, song) //查找歌曲
  playlist.splice(pIndex, 1)  // 把查到的歌曲删掉
  let sIndex = findIndex(sequenceList, song)//查找歌曲索引
  sequenceList.splice(sIndex, 1) // 把查到的歌曲索引删掉
  if (currentIndex > pIndex || currentIndex === playlist.length) {
    currentIndex--
  }

  commit(types.SET_PLAYLIST, playlist)
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  commit(types.SET_CURRENT_INDEX, currentIndex)


  const playingState = playlist.length > 0
  commit(types.SET_PLAYING_STATE, playingState)
}


export const deleteSongList = function ({commit}) {
  commit(types.SET_CURRENT_INDEX, -1)
  commit(types.SET_PLAYLIST, [])
  commit(types.SET_SEQUENCE_LIST, [])
  commit(types.SET_PLAYING_STATE, false)
}

export const savePlayHistory = function ({commit}, song) {
  commit(types.SET_PLAY_HISTORY, savePlay(song))
}

export const saveFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, saveFavorite(song))
}

export const deleteFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, deleteFavorite(song))
}
